﻿using System;
//------------------------------------------------------------------------------
// CCzoomr
//
// ProvidersHelper.cs
//
//------------------------------------------------------------------------------
// Copyright (c) 2007-2008, Scott Dorman (sj_dorman@hotmail.com)
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions are met:
// 
// * Redistributions of source code must retain the above copyright notice, 
//   this list of conditions and the following disclaimer.
// 
// * Redistributions in binary form must reproduce the above copyright notice, 
//   this list of conditions and the following disclaimer in the documentation 
//   and/or other materials provided with the distribution.
// 
// * Neither the name of CCzoomr (http://www.CCzoomr.com) nor the names of its 
//   contributors may be used to endorse or promote products derived from this
//   software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. 
using CCzoomr.Configuration.Provider;
using ThoughtWorks.CruiseControl.Remote;
using System.Collections.ObjectModel;

namespace CCzoomr.Providers
{
    public class CruiseControlNet13BuildServerProvider : BuildServerProvider
    {
        #region events
        #endregion

        #region class-wide fields
        private ICruiseManager manager;
        #endregion

        #region private and internal properties and methods

        #region properties
        #endregion

        #region methods
        #endregion

        #endregion

        #region public properties and methods

        #region properties
        #endregion

        #region methods

        #region ForceBuild
        public override void ForceBuild(string projectName)
        {
            if (projectName == null)
            {
                throw new ArgumentNullException("projectName", Properties.Resources.ArgumentNull_String);
            }

            if (projectName.Length == 0)
            {
                throw new ArgumentException(Properties.Resources.Argument_StringZeroLength, "projectName");
            }

            this.manager.ForceBuild(projectName);
        }
        #endregion

        #region GetArtifactDirectory
        public override string GetArtifactDirectory(string projectName)
        {
            if (projectName == null)
            {
                throw new ArgumentNullException("projectName", Properties.Resources.ArgumentNull_String);
            }

            if (projectName.Length == 0)
            {
                throw new ArgumentException(Properties.Resources.Argument_StringZeroLength, "projectName");
            }

            return this.manager.GetArtifactDirectory(projectName);
        }
        #endregion

        #region GetBuildNames
        public override ReadOnlyCollection<String> GetBuildNames(string projectName)
        {
            if (projectName == null)
            {
                throw new ArgumentNullException("projectName", Properties.Resources.ArgumentNull_String);
            }

            if (projectName.Length == 0)
            {
                throw new ArgumentException(Properties.Resources.Argument_StringZeroLength, "projectName");
            }

            return Array.AsReadOnly(this.manager.GetBuildNames(projectName));
        }
        #endregion

        #region GetServerLog

        #region GetServerLog()
        /// <summary>
        /// Returns a log of recent build server activity. How much information that is returned is configured on the build server.
        /// </summary>
        public override string GetServerLog()
        {
            return manager.GetServerLog();
        }
        #endregion

        #region GetServerLog(string projectName)
        public override string GetServerLog(string projectName)
        {
            if (projectName == null)
            {
                throw new ArgumentNullException("projectName", Properties.Resources.ArgumentNull_String);
            }

            if (projectName.Length == 0)
            {
                throw new ArgumentException(Properties.Resources.Argument_StringZeroLength, "projectName");
            }

            return manager.GetServerLog(projectName);
        }
        #endregion

        #endregion

        #region GetServerVersion
        /// <summary>
        /// Returns the version of the server
        /// </summary>
        public override string GetServerVersion()
        {
            return manager.GetServerVersion();
        }
        #endregion

        #region Initialize
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            base.InitializeCore(name, config, Properties.Resources.Provider_Description);
         
            ICruiseManagerFactory factory = new RemoteCruiseManagerFactory();
            this.manager = factory.GetCruiseManager(this.Uri.AbsoluteUri);
        }
        #endregion

        #endregion

        #endregion
    }
}
